有时需要将交叉(透视)表转换为平面表。这个过程称为“ 数据校准 ”
程序 LibreOffice Calc 没有将数据透视表转换为“的标准功能” 平坦的 ”,但是你可以自己写相应的程序,让我们看看怎么做。
我们看下图可以更清楚地理解问题的本质。左边有一个矩阵形式的表(数据透视表),右边有一个包含列的常规表(平面表):
展开表时,您将解压缩作为矩阵表中列的交集的属性-值对,并将它们重新定向到平面表中的展平列中:
打开菜单 Tools - Macros - Edit Macros...,选择 Module1 并将以下文本复制到模块中:
Sub UnPivotTable
' moonexcel.com.ua
Dim oBook As Object
Dim oActiveSheet As Object
Dim oSelRange As Object
Dim oNewSheet As Object
Dim i As Long
Dim iTopLabelRowCount As Integer
Dim iSideLabelColCount As Integer
oBook = ThisComponent
oActiveSheet = oBook.CurrentController.ActiveSheet
oSelRange = oBook.CurrentSelection
' 添加新工作表
oBook.Sheets.insertNewByName("UnPivoted Table",0)
oNewSheet = oBook.Sheets(0)
' 确定标题的大小
iTopLabelRowCount = InputBox(" 顶部标题有多少行? ")
iSideLabelColCount = InputBox(" 侧标题中有多少列? ")
i = 0
For r = (iTopLabelRowCount + 1) To oSelRange.Rows.Count
For c = (iSideLabelColCount + 1) To oSelRange.Columns.Count
For j = 1 To iSideLabelColCount
oNewSheet.getCellByPosition(j-1, i).Formula = oSelRange.getCellByPosition(j-1, r-1).Formula
Next j
For k = 1 To iTopLabelRowCount
oNewSheet.getCellByPosition(j + k - 2, i).Formula = oSelRange.getCellByPosition(c-1, k-1).Formula
Next k
oNewSheet.getCellByPosition(j + k - 2, i).Formula = oSelRange.getCellByPosition(c-1, r-1).Formula
i = i + 1
Next c
Next r
End Sub
然后,关闭 Macro Editor 并返回到 LibreOffice Calc 中的工作表。选择带有顶部和左侧标题的整个表格,然后通过菜单 Tools - Macros - Run Macro 运行我们的新宏...
该宏将在您的工作簿中插入一个新的命名工作表
您还可以使用该实用程序 “数据透视表 (Unpivot)” 通过安装扩展 YLC_Utilities.oxt 。
之后,该实用程序将在 LibreOffice Calc 中打开的所有文件中可用。